using Microsoft.VisualStudio.TestTools.UnitTesting;
using static FlyIL.AssemblerRegisters;
using static FlyIL.OperandMaker;

namespace FlyIL.Trace.Tests
{



    [TestClass()]
    public class 追踪_失效的情况
    {
        [TestMethod()]
        public void ChangeTest()
        {

            /// 栈有变动 
            {


                var vcontext = new Context(false, 0);

                vcontext.Make().mov(R0L, _byte_[Esp]);
                vcontext.Make().dec(Esp);

                vcontext.Make().add(R1L, R0L);

                var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O2);

                Assert.IsTrue(exp.HasFactorBeenChanged);

            }


            /// 新赋值的情况 
            {


                var vcontext = new Context(true, 0);
                vcontext.Make().sub(Rsp, 2);
                vcontext.Make().add(Rsp, R1);
                vcontext.Make().mov(R6, Rsp);
                vcontext.Make().lea(Rsp, ExprRegister.Rsp + 0x20);   // 这里对前面的 赋值做了 修改  

                vcontext.Make().mov(R7, R6);



                var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);

                Assert.IsTrue(exp.HasFactorBeenChanged);

            }

            {

                var vcontext = new Context(true, 0);
                vcontext.Make().mov(R1, 2);
                vcontext.Make().mov(R1, R2);
                vcontext.Make().add(R2, 3);     // 前面 R2 参与了计算， 这里又将 r2 的值 ， 做了变动 

                vcontext.Make().mov(R3, R1);


                var exp = vcontext.TraceStrict(vcontext.Last, ref vcontext.Last.O1);


                Assert.IsTrue(exp.HasFactorBeenChanged);


            }


        }





    }
}